package cmd

import (
	"fmt"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"

	"BookStack/internal/infrastructure/core"
)

// connectDatabase 连接数据库
func connectDatabase(config *core.Config) (*gorm.DB, error) {
	// 先尝试不指定数据库名连接
	rootDsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/?charset=%s&parseTime=True&loc=Local",
		config.DB.Username,
		config.DB.Password,
		config.DB.Host,
		config.DB.Port,
		config.DB.Charset)

	rootDB, err := gorm.Open(mysql.Open(rootDsn), &gorm.Config{})
	if err != nil {
		return nil, fmt.Errorf("无法连接到MySQL服务器: %v", err)
	}

	// 检查数据库是否存在，不存在则创建
	var count int64
	rootDB.Raw(fmt.Sprintf("SELECT COUNT(*) FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '%s'", config.DB.Name)).Scan(&count)
	if count == 0 {
		// 创建数据库
		if err := rootDB.Exec(fmt.Sprintf("CREATE DATABASE IF NOT EXISTS `%s` DEFAULT CHARACTER SET %s COLLATE %s_general_ci",
			config.DB.Name, config.DB.Charset, config.DB.Charset)).Error; err != nil {
			return nil, fmt.Errorf("无法创建数据库: %v", err)
		}
		fmt.Printf("数据库 '%s' 已成功创建\n", config.DB.Name)
	}

	// 关闭root连接
	sqlDB, _ := rootDB.DB()
	sqlDB.Close()

	// 连接到指定的数据库
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local",
		config.DB.Username,
		config.DB.Password,
		config.DB.Host,
		config.DB.Port,
		config.DB.Name,
		config.DB.Charset)

	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		return nil, err
	}

	sqlDB, err = db.DB()
	if err != nil {
		return nil, err
	}

	// 设置连接池
	sqlDB.SetMaxIdleConns(config.DB.MaxIdle)
	sqlDB.SetMaxOpenConns(config.DB.MaxOpen)
	// 设置连接最大生命周期
	sqlDB.SetConnMaxLifetime(30 * time.Minute)

	return db, nil
}
